<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>原型对象</title>
  </head>
  <body>
    <!-- 
        1、构造函数通过原型分配的函数是所有对象所共享的
        2、javascript规定，每一个构造函数都有一个prototype属性，指向另一个对象，所以我们也称为原型对象
        3、这个对象可以挂载函数，对象实例化不会多次创建原型上函数，节约了内存
        ☆ 我们可以把那些不变的方法，直接定义在prototype对象上，这样所有的对象的实例就可以共享这些方法
        ☆ 构造函数和原型对象中方法的this都指向实例化的对象
    -->

    <!-- 
        ☆ 公共的属性写在构造函数里面
        ☆ 公共的方法写在原型对象身上
    -->
    <script>
      function Star(uname, age) {
        this.uname = uname;
        this.age = age;
      }
      // 将不变的方法写在原型身上
      Star.prototype.sing = function () {
        console.log("我是构造函数原型链中的this",this);
        
        console.log("唱歌");
      };

      const ldh = new Star("刘德华", 52);
      const zjl = new Star("周杰伦", 40);
      console.log(ldh === zjl); // false
      console.log(ldh.sing === zjl.sing); // true
      ldh.sing()
    </script>

    <script>
      let arr = [1, 2, 3];
      // 数组扩展案例，添加一个求和方法 以及 获取最大值的方法
      Array.prototype.max = function () {
        // 展开运算符
        return Math.max(...this); // 指向实例对象
      };

      console.log(arr.max());
      // 求和方法
      Array.prototype.sum = function () {
        return this.reduce((prev, item) => prev + item, 0);
      };
      console.log(arr.sum());
    </script>
  </body>
</html>
